Skill Development

শর্ত ভিত্তিক এবং লুপ

Ansible এ শর্ত ভিত্তিক (Conditional) এবং লুপ (Loop) ফিচার দুটি প্লেবুকের কার্যকারিতা ও ফ্লেক্সিবিলিটি বাড়ানোর জন্য খুবই গুরুত্বপূর্ণ। এগুলির মাধ্যমে আপনি টাস্কগুলোকে কন্ডিশনাল বা পুনরাবৃত্তিমূলক করে তুলতে পারেন। আসুন, এই দুটি সম্পর্কে বিস্তারিত জানি।

১. শর্ত ভিত্তিক (Conditional)

Ansible এ টাস্কগুলোকে নির্দিষ্ট শর্তের উপর ভিত্তি করে চালানো যায়। শর্ত পূরণ না হলে সেই টাস্কটি স্কিপ করা হয়। এটি প্লেবুকে ডায়নামিক সিদ্ধান্ত নেওয়ার জন্য ব্যবহৃত হয়।

শর্ত ভিত্তিক কন্ডিশন ব্যবহার: when

  • when কিওয়ার্ড ব্যবহার করে শর্ত নির্ধারণ করা হয়। এটি একটি লজিক্যাল এক্সপ্রেশন বা ভ্যারিয়েবলের মান চেক করে।
  • যদি when কন্ডিশনটি সত্য (True) হয়, তাহলে সেই টাস্কটি চালানো হবে। অন্যথায়, এটি স্কিপ করা হবে।

উদাহরণ:

---
- name: Conditional Task Example
  hosts: localhost
  tasks:
    - name: Install Apache only on Debian systems
      apt:
        name: apache2
        state: present
      when: ansible_facts['os_family'] == 'Debian'

ব্যাখ্যা:

  • এখানে when কন্ডিশন ব্যবহার করে চেক করা হয়েছে যে সিস্টেমের অপারেটিং সিস্টেম ফ্যামিলি Debian কিনা।
  • যদি সিস্টেম Debian হয়, তাহলে apache2 ইনস্টল করা হবে; নতুবা টাস্কটি স্কিপ হবে।

শর্ত হিসেবে ভ্যারিয়েবল বা রেজিস্টার ব্যবহার

---
- name: Example with registered variable
  hosts: localhost
  tasks:
    - name: Check if a file exists
      stat:
        path: /etc/passwd
      register: file_check

    - name: Display message if file exists
      debug:
        msg: "The file exists!"
      when: file_check.stat.exists

ব্যাখ্যা:

  • প্রথম টাস্কে stat মডিউল দিয়ে ফাইল চেক করা হয়েছে এবং ফলাফল file_check এ সংরক্ষণ করা হয়েছে।
  • দ্বিতীয় টাস্ক তখনই চালানো হবে যখন file_check.stat.exists সত্য হবে অর্থাৎ ফাইলটি সিস্টেমে বিদ্যমান।

২. লুপ (Loop)

Ansible এ loop ব্যবহার করে একই টাস্ককে একাধিক মানের উপর পুনরাবৃত্তি করে চালানো যায়। এটি তখনই কার্যকর, যখন আপনাকে একই ধরনের কাজ একাধিক মান বা আইটেমের উপর করতে হয়।

লুপ ব্যবহার: loop

  • loop কিওয়ার্ডের মাধ্যমে আপনি একটি লিস্ট বা আইটেম সেট নির্ধারণ করতে পারেন এবং সেই লিস্টের প্রতিটি আইটেমের উপর টাস্কটি চালানো হবে।

উদাহরণ:

---
- name: Install multiple packages
  hosts: localhost
  tasks:
    - name: Install necessary packages
      apt:
        name: "{{ item }}"
        state: present
      loop:
        - apache2
        - mysql-server
        - php

ব্যাখ্যা:

  • এখানে loop দিয়ে একটি লিস্ট ব্যবহার করা হয়েছে যাতে তিনটি প্যাকেজ (apache2, mysql-server, php) ইনস্টল করা হবে।
  • প্রতিটি আইটেমের জন্য টাস্কটি পুনরাবৃত্তি করে চালানো হবে।

আরও উদাহরণ: লুপ এবং ভ্যারিয়েবলের সাথে

---
- name: Add multiple users
  hosts: localhost
  tasks:
    - name: Create users
      user:
        name: "{{ item.name }}"
        state: present
        shell: "{{ item.shell }}"
      loop:
        - { name: 'alice', shell: '/bin/bash' }
        - { name: 'bob', shell: '/bin/zsh' }

ব্যাখ্যা:

  • এখানে প্রতিটি লুপ আইটেমে একটি ডিকশনারি আছে যাতে name এবং shell কনফিগারেশন উল্লেখ করা আছে।
  • user মডিউলটি প্রতিটি আইটেমের জন্য চালানো হচ্ছে এবং নতুন ইউজার তৈরি করা হচ্ছে।

with_items এবং লুপ কন্ট্রোল (লুপের আগের ফর্ম্যাট)

Ansible এর আগের সংস্করণে loop এর পরিবর্তে with_items ব্যবহার করা হতো। এটি এখন পুরনো ফর্ম্যাট হিসেবে বিবেচিত হলেও এখনো অনেক স্ক্রিপ্টে এটি দেখা যায়:

---
- name: Install packages with with_items
  hosts: localhost
  tasks:
    - name: Install multiple packages
      apt:
        name: "{{ item }}"
        state: present
      with_items:
        - apache2
        - mysql-server
        - php

লুপ কন্ট্রোল (Loop Control)

কখনও কখনও আপনি লুপের চলার প্রক্রিয়া নিয়ন্ত্রণ করতে চান, যেমন লুপের ইনডেক্স ব্যবহার করা বা প্রতিটি লুপের মধ্যে একটি নির্দিষ্ট সময় বিরতি দেওয়া। এর জন্য loop_control ব্যবহার করা যায়।

---
- name: Loop control example
  hosts: localhost
  tasks:
    - name: Install packages with index
      apt:
        name: "{{ item }}"
        state: present
      loop:
        - apache2
        - mysql-server
        - php
      loop_control:
        index_var: loop_index
    - name: Display loop index
      debug:
        msg: "This is the {{ loop_index }} iteration."

সংক্ষেপে পার্থক্য:

বৈশিষ্ট্যশর্ত ভিত্তিক (Conditional)লুপ (Loop)
কিভাবে কাজ করেনির্দিষ্ট শর্তের উপর ভিত্তি করে টাস্ক চালায়একটি লিস্টের প্রতিটি আইটেমের উপর টাস্ক পুনরাবৃত্তি করে চালায়
কিওয়ার্ডwhenloop, with_items
ব্যবহারসিস্টেম স্টেট বা ভ্যারিয়েবলের মান চেক করাএকাধিক আইটেমের উপর একই ধরনের টাস্ক চালানো

এই ফিচারগুলো Ansible প্লেবুককে আরও ডায়নামিক, ফ্লেক্সিবল এবং এফিশিয়েন্ট করে তোলে।

when কন্ডিশন ব্যবহার করে টাস্ক নিয়ন্ত্রণ

Ansible এ when কন্ডিশন ব্যবহার করে আপনি নির্দিষ্ট শর্ত (condition) মেনে টাস্ক নিয়ন্ত্রণ করতে পারেন। অর্থাৎ, আপনি টাস্ক বা টাস্কগুলিকে এমনভাবে কন্ডিশনাল করতে পারেন যেন তা শুধুমাত্র নির্দিষ্ট শর্ত পূরণ হলেই কার্যকর হয়। এটি Ansible প্লেবুককে ডাইনামিক এবং নমনীয় করতে সাহায্য করে।

when কন্ডিশন কীভাবে কাজ করে?

when কন্ডিশন সাধারণত একটি লজিক্যাল এক্সপ্রেশন গ্রহণ করে, যা সত্য (true) বা মিথ্যা (false) হতে পারে। যদি কন্ডিশন সত্য হয়, তাহলে টাস্কটি কার্যকর হয়; অন্যথায়, তা স্কিপ করা হয়।

when কন্ডিশন ব্যবহার করার সাধারণ ফরম্যাট

tasks:
  - name: Task Name
    module_name:
      parameter: value
    when: condition

উদাহরণ ১: অপারেটিং সিস্টেম ভিত্তিক টাস্ক

নিচের উদাহরণে আমরা দেখবো কিভাবে when কন্ডিশন ব্যবহার করে একটি টাস্ককে নির্দিষ্ট অপারেটিং সিস্টেমে কার্যকর করা যায়।

---
- name: Install Apache only on Ubuntu systems
  hosts: all
  become: yes
  tasks:
    - name: Install Apache on Ubuntu
      apt:
        name: apache2
        state: present
      when: ansible_distribution == "Ubuntu"

এখানে, when কন্ডিশন চেক করছে হোস্টের অপারেটিং সিস্টেম Ubuntu কিনা (ansible_distribution == "Ubuntu")। যদি হোস্টের অপারেটিং সিস্টেম Ubuntu হয়, তখন Apache ইনস্টল করা হবে।

উদাহরণ ২: ভ্যারিয়েবল ভিত্তিক কন্ডিশন

অনেক সময় প্লেবুকে ডিফাইন করা ভ্যারিয়েবল বা হোস্ট ভ্যারিয়েবলের উপর ভিত্তি করে টাস্ক নিয়ন্ত্রণ করতে হয়।

---
- name: Install Nginx based on variable
  hosts: all
  become: yes
  vars:
    install_nginx: true

  tasks:
    - name: Install Nginx
      apt:
        name: nginx
        state: present
      when: install_nginx

এখানে, install_nginx নামে একটি ভ্যারিয়েবল তৈরি করা হয়েছে। যদি এর মান true হয়, তাহলে Nginx ইনস্টল করা হবে।

উদাহরণ ৩: মডিউল আউটপুট ভিত্তিক কন্ডিশন

কিছু কিছু ক্ষেত্রে, একটি টাস্কের আউটপুট বা রেজাল্টের উপর ভিত্তি করে পরবর্তী টাস্ক কার্যকর করা হয়।

---
- name: Check if a file exists and create if it doesn't
  hosts: all
  become: yes
  tasks:
    - name: Check if /tmp/testfile exists
      stat:
        path: /tmp/testfile
      register: file_status

    - name: Create the file if it doesn't exist
      file:
        path: /tmp/testfile
        state: touch
      when: not file_status.stat.exists

এখানে, প্রথম টাস্কটি /tmp/testfile ফাইলের স্ট্যাটাস চেক করে এবং আউটপুট file_status নামে রেজিস্টারে সংরক্ষণ করে। পরবর্তী টাস্কটি when কন্ডিশন ব্যবহার করে চেক করে যদি ফাইলটি না থাকে (not file_status.stat.exists), তখন এটি ফাইল তৈরি করবে।

when কন্ডিশন: অপারেটর এবং লজিক্যাল এক্সপ্রেশন

when কন্ডিশনে আপনি বিভিন্ন অপারেটর এবং লজিক্যাল এক্সপ্রেশন ব্যবহার করতে পারেন:

  • সমান (==): দুটি মান সমান কিনা চেক করে।
  • অসমান (!=): দুটি মান অসমান কিনা চেক করে।
  • বৃহত্তর (>), ছোট (<): তুলনামূলক অপারেটর।
  • and, or, not: লজিক্যাল অপারেটর যা একাধিক শর্ত একত্রে চেক করতে সাহায্য করে।

উদাহরণ:

- name: Install package if OS is Ubuntu and version is 20.04
  apt:
    name: apache2
    state: present
  when: ansible_distribution == "Ubuntu" and ansible_distribution_version == "20.04"

এখানে, Apache ইনস্টল করা হবে শুধুমাত্র যদি অপারেটিং সিস্টেম Ubuntu হয় এবং এর ভার্সন 20.04 হয়।

সংক্ষেপে

Ansible এ when কন্ডিশন ব্যবহার করে টাস্ক বা টাস্কগুলোকে নির্দিষ্ট শর্ত অনুযায়ী কার্যকর করা যায়। এটি প্লেবুককে ডাইনামিক এবং নমনীয় করে তোলে, যাতে বিভিন্ন হোস্ট বা ভ্যারিয়েবলের ভিত্তিতে স্বয়ংক্রিয়ভাবে কাজ সম্পন্ন করা যায়।

লুপ এবং এর ব্যবহার (loop, with_items)

Ansible-এ লুপ ব্যবহার করা হয় একাধিক আইটেম বা উপাদানের উপর একই কাজ বারবার চালানোর জন্য। লুপ ব্যবহার করে আপনি একটি টাস্ককে পুনরাবৃত্তি করতে পারেন, যা প্লেবুককে আরও কার্যকর এবং সংক্ষিপ্ত করে তোলে। Ansible-এ লুপের জন্য প্রধানত দুটি পদ্ধতি ব্যবহৃত হয়: loop এবং with_items। Ansible 2.5 থেকে loop পদ্ধতিটি প্রচলিত এবং এটি নতুনতম ও আরও কার্যকর উপায়, যেখানে with_items পুরোনো এবং সামঞ্জস্য বজায় রাখার জন্য রাখা হয়েছে।

১. loop ব্যবহার

loop হলো Ansible-এ লুপ চালানোর আধুনিক পদ্ধতি। এটি সাধারণত এক বা একাধিক আইটেমের উপর টাস্ক পুনরাবৃত্তি করার জন্য ব্যবহার করা হয়। এটি সহজ, সরল এবং পড়তে সুবিধাজনক।

উদাহরণ

নিচে একটি সাধারণ উদাহরণ দেয়া হলো যেখানে একটি সার্ভার-এ একাধিক প্যাকেজ ইনস্টল করা হচ্ছে:

---
- name: Install multiple packages
  hosts: all
  become: yes
  tasks:
    - name: Install packages
      yum:
        name: "{{ item }}"
        state: present
      loop:
        - httpd
        - mariadb-server
        - php

বিশ্লেষণ:

  • এখানে loop ব্যবহার করে একাধিক প্যাকেজ (httpd, mariadb-server, php) ইনস্টল করা হচ্ছে।
  • {{ item }} হলো লুপের প্রতিটি আইটেমের মান, যা প্রতিবার লুপ চলার সময় পরিবর্তিত হয়।

loop এর আরও উদাহরণ

একটি ফাইলের মালিকানা পরিবর্তন করতে নিচের মত লুপ ব্যবহার করা যেতে পারে:

---
- name: Change ownership of files
  hosts: all
  become: yes
  tasks:
    - name: Set ownership of files
      file:
        path: "{{ item.path }}"
        owner: "{{ item.owner }}"
        group: "{{ item.group }}"
        mode: "{{ item.mode }}"
      loop:
        - { path: /var/www/html/index.html, owner: apache, group: apache, mode: '0644' }
        - { path: /var/www/html/app.php, owner: apache, group: apache, mode: '0644' }

বিশ্লেষণ:

  • এখানে লুপের মাধ্যমে একাধিক ফাইলের মালিকানা এবং অনুমতি সেট করা হচ্ছে।
  • প্রতিটি আইটেম একটি ডিকশনারি হিসাবে উল্লেখ করা হয়েছে, যা ভিন্ন ভিন্ন মান ধরে রাখছে।

২. with_items ব্যবহার

with_items হলো লুপ চালানোর পুরোনো পদ্ধতি। এটি loop এর মত কাজ করে, তবে নতুন সংস্করণগুলোতে loop ব্যবহারে উৎসাহিত করা হয়। যদিও এটি এখনও কার্যকর, এটি মূলত পুরোনো প্লেবুকগুলোর সাথে সামঞ্জস্য বজায় রাখার জন্য রাখা হয়েছে।

উদাহরণ

নিচে একটি উদাহরণ দেয়া হলো যেখানে with_items ব্যবহার করে একাধিক প্যাকেজ ইনস্টল করা হচ্ছে:

---
- name: Install multiple packages
  hosts: all
  become: yes
  tasks:
    - name: Install packages
      yum:
        name: "{{ item }}"
        state: present
      with_items:
        - httpd
        - mariadb-server
        - php

loop এবং with_items এর তুলনা

বৈশিষ্ট্যloopwith_items
আধুনিকতানতুন এবং প্রচলিতপুরোনো এবং সামঞ্জস্য বজায় রাখার জন্য
সিনট্যাক্সসহজ এবং সরলকিছুটা বেশি লিখতে হয়
কার্যকারিতাঅধিক কার্যকরসাধারণ কার্যকর, তবে পুরোনো পদ্ধতি

লুপের ব্যবহার ক্ষেত্র

  • একাধিক প্যাকেজ ইনস্টল: যেমন একটি টাস্কে একাধিক প্যাকেজ ইনস্টল করা।
  • ফাইল মালিকানা ও অনুমতি পরিবর্তন: যেমন একাধিক ফাইলের মালিকানা বা অনুমতি পরিবর্তন করা।
  • সার্ভিস ম্যানেজমেন্ট: যেমন একাধিক সার্ভিস চালু বা বন্ধ করা।

সারাংশ

  • loop: নতুন এবং আধুনিক পদ্ধতি, যা সাধারণত ব্যবহার করা উচিত।
  • with_items: পুরোনো পদ্ধতি, যা পুরোনো প্লেবুকগুলোর সামঞ্জস্য রক্ষার জন্য রাখা হয়েছে।

Ansible প্লেবুক লেখার সময় loop ব্যবহার করা হলে কোড আরও সংক্ষিপ্ত এবং কার্যকর হয়। with_items ব্যবহার করা যায়, তবে নতুন কোড লেখার সময় loop ব্যবহারে উৎসাহিত করা হয়।

block এবং rescue ব্যবহার করে ত্রুটি নিয়ন্ত্রণ

Ansible এ block এবং rescue ব্যবহার করে ত্রুটি নিয়ন্ত্রণ (Error Handling) খুব সহজ এবং কার্যকরী হয়। block এবং rescue কিওয়ার্ডগুলোর মাধ্যমে আপনি প্লেবুকে এমনভাবে টাস্ক লিখতে পারেন, যাতে কোনো টাস্ক ব্যর্থ হলেও আপনি সেগুলোর উপর নিয়ন্ত্রণ রাখতে পারেন এবং ব্যর্থতার পরবর্তী অ্যাকশন নির্ধারণ করতে পারেন। এটি প্রায় প্রোগ্রামিং ভাষার try-catch মেকানিজমের মতো।

Block, Rescue, এবং Always এর কাজ

Ansible এ block একটি ব্লক তৈরি করে যার মধ্যে একাধিক টাস্ক গ্রুপ করা যায়। এর সাথে rescue এবং always ব্যবহার করে ত্রুটি বা ব্যতিক্রম নিয়ন্ত্রণ করা যায়।

  • block: একটি টাস্ক বা টাস্কের গ্রুপ যা একত্রে রান করবে। যদি এই ব্লকের কোনো টাস্ক ব্যর্থ হয়, তখন rescue চালানো হবে।
  • rescue: যখন block এর কোনো টাস্ক ব্যর্থ হয়, তখন rescue ব্লকটি চালানো হয়। এটি সাধারণত ব্যাকআপ প্ল্যান বা এরর হ্যান্ডলিংয়ের জন্য ব্যবহৃত হয়।
  • always: always ব্লক সবসময় চালানো হয়, এটি block বা rescue সফল বা ব্যর্থ যাই হোক না কেন। এটি পরিষ্কার করার কাজ বা ফাইনাল টাস্কের জন্য ব্যবহার করা হয়।

উদাহরণ: Block এবং Rescue ব্যবহার করা

---
- name: Example of block and rescue
  hosts: localhost
  tasks:
    - name: Main block
      block:
        - name: Try to create a file
          file:
            path: /tmp/example.txt
            state: touch

        - name: Simulate a failure
          command: /bin/false

      rescue:
        - name: Handle the failure by creating a different file
          file:
            path: /tmp/rescue_file.txt
            state: touch

      always:
        - name: Always clean up
          file:
            path: /tmp/temp_cleanup.txt
            state: touch

ব্যাখ্যা:

Main block:

  • block এর মধ্যে দুটি টাস্ক আছে। প্রথম টাস্কটি /tmp/example.txt ফাইল তৈরি করছে।
  • দ্বিতীয় টাস্কটি /bin/false কমান্ড চালাচ্ছে, যা ইচ্ছাকৃতভাবে ব্যর্থ হবে।

Rescue block:

  • যখন block এর কোনো টাস্ক ব্যর্থ হবে, তখন rescue ব্লকটি চালু হবে। এখানে rescue ব্লকে /tmp/rescue_file.txt নামে একটি ফাইল তৈরি করা হয়েছে।

Always block:

  • always ব্লক সবসময় চালানো হবে, চূড়ান্ত কাজ বা ক্লিনআপ কাজ করার জন্য। এখানে /tmp/temp_cleanup.txt ফাইলটি তৈরি করা হয়েছে।

ব্লক, রেসকিউ, এবং অলওয়েজের ব্যবহার কৌশল:

  • Block: যখন আপনি একসাথে একাধিক টাস্ক চালাতে চান যা পরস্পরের উপর নির্ভরশীল, তখন ব্লক ব্যবহার করা হয়।
  • Rescue: কোনো টাস্ক ব্যর্থ হলে আপনি তৎক্ষণাৎ বিকল্প ব্যবস্থা নিতে চান, তখন রেসকিউ ব্লক ব্যবহার করেন।
  • Always: প্লেবুক বা টাস্কের শেষে ক্লিনআপ বা চূড়ান্ত পদক্ষেপ নিতে Always ব্লক ব্যবহার করা হয়। এটি একটি ব্লকের শেষ পদক্ষেপ হিসেবে ব্যবহৃত হয়।

একটি বাস্তব উদাহরণ: প্যাকেজ ইনস্টলেশন

 

---
- name: Install a package with error handling
  hosts: localhost
  tasks:
    - name: Install nginx package
      block:
        - name: Try to install nginx
          apt:
            name: nginx
            state: present
          register: install_result
          ignore_errors: yes

        - name: Verify if nginx was installed
          command: nginx -v
          register: verify_result

      rescue:
        - name: Log installation failure
          debug:
            msg: "Nginx installation failed. Attempting to fix or clean up."

        - name: Remove partially installed nginx
          apt:
            name: nginx
            state: absent

      always:
        - name: Clean up temporary files if any
          file:
            path: /tmp/nginx_install.log
            state: absent

ব্যাখ্যা:

  • Block: এই ব্লকে nginx প্যাকেজ ইনস্টল করা হয়েছে এবং ইনস্টলেশন যাচাই করা হয়েছে। ignore_errors: yes দিয়ে ইনস্টলেশনের ত্রুটি উপেক্ষা করা হয়েছে যাতে ব্লকের পরবর্তী টাস্ক চালানো যায়।
  • Rescue: যদি ইনস্টলেশন ব্যর্থ হয়, তাহলে rescue ব্লক চালানো হবে যেখানে ইনস্টলেশনের ব্যর্থতার কারণে কিছু পরিষ্কার বা ফিক্স করার ব্যবস্থা করা হয়েছে।
  • Always: শেষে, /tmp/nginx_install.log ফাইল (যদি কোনো লোগ সংরক্ষণ করা হয়) ক্লিনআপ করা হয়েছে।

সংক্ষেপে:

বৈশিষ্ট্যবর্ণনা
Blockটাস্কগুলিকে গ্রুপ করে একসাথে চালায়।
RescueBlock ব্যর্থ হলে বিকল্প টাস্ক চালায়।
AlwaysBlock এবং Rescue সফল বা ব্যর্থ যাই হোক, সবসময় চালায়।

Ansible এ block, rescue, এবং always ব্যবহার করে প্লেবুকগুলোকে আরও ফ্লেক্সিবল এবং রেসিলিয়েন্ট করা যায়, যাতে টাস্ক ব্যর্থ হলেও উপযুক্তভাবে হ্যান্ডেল করা সম্ভব হয়।

আরও দেখুন...

Promotion